package interfaceGrafica;

import negocios.*;
import persistencia.*;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.Timer;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;

@SuppressWarnings("serial")
public class PainelDesafio extends PainelJogo {
	private Desafio desafio;
	private Repositorio repositorio;
	private Timer timer;

	private JLabel ponteiro;
	private float angulo;
	private int tempoMax;

	private JLabel quadro1;
	private JLabel quadro2;
	private JLabel quadro3;
	private JLabel quadro4;
	private JLabel quadro5;
	private JLabel quadro6;
	private JLabel quadro7;
	private JLabel quadro8;
	private JLabel quadro9;

	private JLabel time;
	private JLabel answered;

	public PainelDesafio(Janela janela, MenuPrincipal menuPrincipal,
			Desafio desafio) {
		super(janela, menuPrincipal);
		this.desafio = desafio;
		this.janela = janela;
		this.menuPrincipal = menuPrincipal;

		this.backgroundImagem = new ImageIcon(
				"Data\\Imagens\\TreinamentoDesafio\\backgroundDesafio.png");
		this.background.setIcon(backgroundImagem);

		quadro1 = new JLabel();
		inicializarQuadro(this, quadro1, quadroImagem, 16, 139,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro1.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro1);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro1);
			}
		});
		quadro1.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro1, evt);
			}
		});

		quadro2 = new JLabel();
		inicializarQuadro(this, quadro2, quadroImagem, 148, 139,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro2.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro2);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro2);
			}
		});
		quadro2.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro2, evt);
			}
		});

		quadro3 = new JLabel();
		inicializarQuadro(this, quadro3, quadroImagem, 280, 139,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro3.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro3);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro3);
			}
		});
		quadro3.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro3, evt);
			}
		});

		quadro4 = new JLabel();
		inicializarQuadro(this, quadro4, quadroImagem, 16, 271,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro4.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro4);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro4);
			}
		});
		quadro4.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro4, evt);
			}
		});

		quadro5 = new JLabel();
		inicializarQuadro(this, quadro5, quadroImagem, 148, 271,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro5.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro5);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro5);
			}
		});
		quadro5.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro5, evt);
			}
		});

		quadro6 = new JLabel();
		inicializarQuadro(this, quadro6, quadroImagem, 280, 271,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro6.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro6);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro6);
			}
		});
		quadro6.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro6, evt);
			}
		});

		quadro7 = new JLabel();
		inicializarQuadro(this, quadro7, quadroImagem, 16, 403,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro7.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro7);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro7);
			}
		});
		quadro7.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro7, evt);
			}
		});

		quadro8 = new JLabel();
		inicializarQuadro(this, quadro8, quadroImagem, 148, 403,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro8.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro8);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro8);
			}
		});
		quadro8.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro8, evt);
			}
		});

		quadro9 = new JLabel();
		inicializarQuadro(this, quadro9, quadroImagem, 280, 403,
				quadroImagem.getIconWidth(), quadroImagem.getIconHeight());
		quadro9.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				mousePressionar(quadro9);
			}

			public void mouseReleased(MouseEvent evt) {
				mouseSoltar(quadro9);
			}
		});
		quadro9.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent evt) {
				mouseArrastar(quadro9, evt);
			}
		});

		this.time = new JLabel();
		this.time.setText("Starting");
		this.time.setBounds(167, 533, 233, 28);
		this.time.setFont(new Font("Arial", 1, 20));
		super.add(time, JLayeredPane.PALETTE_LAYER);

		this.answered = new JLabel();
		this.answered.setText("0");
		this.answered.setBounds(167, 562, 233, 28);
		this.answered.setFont(new Font("Arial", 1, 20));
		super.add(answered, JLayeredPane.PALETTE_LAYER);

		clear = new JButton();
		MenuPrincipal.inicializarBotao(this, clear, clearImagem1, clearImagem2,
				clearImagem3, 500, 215, 70, 85);
		clear.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				mouseClicar(clear, 1);
			}
		});

		confirm = new JButton();
		MenuPrincipal.inicializarBotao(this, confirm, confirmImagem1,
				confirmImagem2, confirmImagem3, 569, 215, 70, 85);
		confirm.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				mouseClicar(confirm, 2);
			}
		});

		next = new JButton();
		MenuPrincipal.inicializarBotao(this, next, nextImagem1, nextImagem2,
				nextImagem3, 638, 215, 70, 85);
		next.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				mouseClicar(next, 3);
			}
		});

		home = new JButton();
		MenuPrincipal.inicializarBotao(this, home, homeImagem1, homeImagem2,
				homeImagem3, 674, 503, 70, 85);
		home.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				mouseClicar(home, 4);
			}
		});

		exit = new JButton();
		MenuPrincipal.inicializarBotao(this, exit, exitImagem1, exitImagem2,
				exitImagem3, 725, 503, 70, 85);
		exit.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				mouseClicar(exit, 5);
			}
		});

		ActionListener timerTask = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				decrementarTempo();
			}
		};
		timer = new Timer(1000, timerTask);
		timer.start();

		repositorio = new Repositorio();
		try {
			repositorio.lerArquivo("Data//Arquivos//Easy.txt");
		} catch (IOException e) {
			System.out
					.println("Erro na leitura do arquivo Data//Arquivos//Easy.txt");
		}
		desafio.getGerenciadorDeVerbos().carregarVerbos(
				repositorio.escreverArquivo());
		desafio.setLimite1(desafio.getGerenciadorDeVerbos().tamanhoArray());
		repositorio = new Repositorio();
		try {
			repositorio.lerArquivo("Data//Arquivos//Medium.txt");
		} catch (IOException e) {
			System.out
					.println("Erro na leitura do arquivo Data//Arquivos//Medium.txt");
		}
		desafio.getGerenciadorDeVerbos().carregarVerbos(
				repositorio.escreverArquivo());
		desafio.setLimite2(desafio.getGerenciadorDeVerbos().tamanhoArray());
		repositorio = new Repositorio();
		try {
			repositorio.lerArquivo("Data//Arquivos//Hard.txt");
		} catch (IOException e) {
			System.out
					.println("Erro na leitura do arquivo Data//Arquivos//Hard.txt");
		}
		desafio.getGerenciadorDeVerbos().carregarVerbos(
				repositorio.escreverArquivo());
		desafio.proximaJogada();

		tempoMax = desafio.getTempo();

		angulo = 0;
		ponteiro = new JLabel() {
			private Graphics2D g2d;

			@Override
			public void paintComponent(Graphics g) {
				g2d = (Graphics2D) g;
				g2d.setStroke(new BasicStroke(3));
				g2d.drawLine(69, 67, 69, 20);
				g2d.rotate(Math.toRadians(angulo), 69, 67);
				g2d.drawLine(69, 67, 69, 3);

			}
		};
		ponteiro.setBounds(526, 333, 140, 139);
		super.add(ponteiro, JLayeredPane.MODAL_LAYER);

		iniciarJogada();

	}

	private void mouseClicar(JButton botao, int escolha) {
		if (!botao.isEnabled())
			return;
		switch (escolha) {
		case 1:
			this.drop1.setText("");
			this.drop2.setText("");
			this.drop3.setText("");
			break;

		case 2:
			int respondidos = Integer.valueOf(answered.getText());
			respondidos++;
			answered.setText(Integer.toString(respondidos));
			desafio.confirmarJogada(drop1.getText(), drop2.getText(),
					drop3.getText());
			this.drop1.setText("");
			this.drop2.setText("");
			this.drop3.setText("");
			desafio.proximaJogada();
			iniciarJogada();
			break;

		case 3:
			this.drop1.setText("");
			this.drop2.setText("");
			this.drop3.setText("");
			desafio.proximaJogada();
			iniciarJogada();
			break;

		case 4:
			janela.setContentPane(menuPrincipal);
			janela.pack();
			break;

		case 5:
			System.exit(0);
			break;

		default:

			break;
		}
	}

	public void iniciarJogada() {
		this.translation.setText(desafio.getVerboCerto().getTraducao());
		ArrayList<String> lista = new ArrayList<String>();
		lista = verificarOcorrencia(lista, desafio.getVerboCerto());
		lista = verificarOcorrencia(lista, desafio.getVerboErrado1());
		lista = verificarOcorrencia(lista, desafio.getVerboErrado2());
		lista = verificarOcorrencia(lista, desafio.getVerboErrado3());
		Collections.shuffle(lista);
		if (lista.size()==9)
		{
			quadro1.setText(lista.get(0));
			quadro2.setText(lista.get(1));
			quadro3.setText(lista.get(2));
			quadro4.setText(lista.get(3));
			quadro5.setText(lista.get(4));
			quadro6.setText(lista.get(5));
			quadro7.setText(lista.get(6));
			quadro8.setText(lista.get(7));
			quadro9.setText(lista.get(8));
		}
	}

	public ArrayList<String> verificarOcorrencia(ArrayList<String> lista,
			FormaVerbal verbo) {
		boolean validar = true;

		for (String string : lista) {
			if (string.equals(verbo.getInfinitive())) {
				validar = false;
			}
		}
		if (validar == true) {
			lista.add(verbo.getInfinitive());
		}

		validar = true;
		for (String string : lista) {
			if (string.equals(verbo.getSimplePast())) {
				validar = false;
			}
		}
		if (validar == true) {
			lista.add(verbo.getSimplePast());
		}
		validar = true;
		for (String string : lista) {
			if (string.equals(verbo.getPastParticiple())) {
				validar = false;
			}
		}
		if (validar == true) {
			lista.add(verbo.getPastParticiple());
		}
		return lista;
	}

	public void decrementarTempo() {
		if (time.getText().equals("00")) {
			timer.stop();
			janela.setContentPane(new PainelTabela(janela, menuPrincipal,
					desafio));
			janela.pack();
		}
		this.time.setText(String.format("%02d", desafio.getTempo()));
		desafio.decrementarTempo();
		ponteiro.setVisible(false);
		ponteiro.setVisible(true);
		if (desafio.getTempo() < tempoMax - 1) {
			angulo += 6;
		}
		if (time.getText().equals("10")) {
			time.setForeground(Color.RED);
			time.setFont(new Font("Arial", 1, 36));
		}
	}

}
